#include "App_Message.h"

/**
 * @brief 字符串数组转化为JSON字符串
 *
 * @param str_data 字符串数组
 * @param len 数组长度
 * @return char* 返回JSON字符串
 */
char *App_Message_StrToJson(char *str_data, int len)
{
    // 1. 获取字符数组中的connect_type,id_len, msg_len, id, msg
    int connect_type = str_data[0];
    int id_len = str_data[1];
    int msg_len = str_data[2];
    char id[id_len];
    char msg[msg_len];
    memcpy(id, str_data + 3, id_len);
    memcpy(msg, str_data + 3 + id_len, msg_len);

    // 2. 将id和msg转换为十六进制字符串id_hexstr和msg_hexstr
    char *id_hexstr = App_Common_StrToHexStr(id, id_len);
    char *msg_hexstr = App_Common_StrToHexStr(msg, msg_len);
    // 3. 将connect_type,id_len, msg_len, id_hexstr, msg_hexstr拼接成JSON字符串
    // 3.1 创建JSON对象
    cJSON *root = cJSON_CreateObject();
    // 3.2 添加cJSON对象属性
    cJSON_AddNumberToObject(root, "Connect_Type", connect_type);
    cJSON_AddStringToObject(root, "id", id_hexstr);
    cJSON_AddStringToObject(root, "msg", msg_hexstr);

    // 3.3 将JSON对象转化为为初始化的cJSON数据
    char *json = cJSON_PrintUnformatted(root);
    // 4. 释放内存
    cJSON_Delete(root);
    free(id_hexstr);
    free(msg_hexstr);
    // 5.返回JSON字符串
    return json;
}

/**
 * @brief JSON字符串转化为字符串数组
 *
 * @param json_data JSON字符串
 * @param str_data 接收缓存区
 * @param str_len 接收缓存区大小
 * @return int 返回实际数据长度
 */
int App_Message_JsonToStr(char *json_data, char *str_data, int str_len)
{
    // 1. 解析JSON数据,获取connect_type, id, msg
    cJSON *root_obj = cJSON_Parse(json_data);
    int connect_type = cJSON_GetObjectItem(root_obj, "Connect_Type")->valueint;
    char *id_hexstr = cJSON_GetObjectItem(root_obj, "id")->valuestring;
    char *msg_hexstr = cJSON_GetObjectItem(root_obj, "msg")->valuestring;

    // 2. 将十六进制数据转换为字符串数组
    int id_len;
    int msg_len;
    char *id = App_Common_HexStrToStr(id_hexstr, &id_len);
    char *msg = App_Common_HexStrToStr(msg_hexstr, &msg_len);
    // 3. 组合字符数据
    int len = 3 + id_len + msg_len;
    //3.1 检查数据长度是否符合要求
    if (str_len < len)
    {
        log_error("str_data存储空间不足!");
        // 释放内存
        cJSON_Delete(root_obj);
        free(id);
        free(msg);
        return -1;
    }
    // 3.2 组合字符数组
    str_data[0] = connect_type;
    str_data[1] = id_len;
    str_data[2] = msg_len;
    memcpy(str_data + 3, id, id_len);
    memcpy(str_data + 3 + id_len, msg, msg_len);
    // 4. 释放内存空间
    cJSON_Delete(root_obj);
    free(id);
    free(msg);
    // 5. 返回实际数据长度
    return len;
}
